/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.barbon.sudoku.model.servico;

import br.barbon.sudoku.model.entidade.Posicao;
import br.barbon.sudoku.model.entidade.Tabuleiro;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

/**
 *
 * @author Barbon
 */
public abstract class TabuleiroService {

    public static int identificaQuadrado(int linha, int coluna) {

        if (linha >= 7 && coluna >= 7) {
            return 9;
        } else if (linha >= 7 && coluna >= 4) {
            return 8;
        } else if (linha >= 7 && coluna >= 1) {
            return 7;
        } else if (linha >= 4 && coluna >= 7) {
            return 6;
        } else if (linha >= 4 && coluna >= 4) {
            return 5;
        } else if (linha >= 4 && coluna >= 1) {
            return 4;
        } else if (linha >= 1 && coluna >= 7) {
            return 3;
        } else if (linha >= 1 && coluna >= 4) {
            return 2;
        } else {
            return 1;
        }
    }

    public static void iniciarTabuleiro(Tabuleiro tab) {
        int qtdePos;
        int lin;
        int col;
        int valor;
        
        Posicao p;
        Posicao primeiraPosicao;
        
        Random r = new Random(new Date().getTime());

        qtdePos = r.nextInt(49) + 1;

        for (int i = 1; i < qtdePos; i++) {
            lin = r.nextInt(8) + 1;
            col = r.nextInt(8) + 1;
            valor = r.nextInt(8) + 1;

            p = tab.getPosicao().get(getChave(lin, col));
            primeiraPosicao = p;
            
            while (!PosicaoService.preDefinirPosicao(p, (byte) valor)) {
                
                p = proximaPosicao(tab, p);
                
                if (p.equals(primeiraPosicao)) {
                    
                    valor++;
                    
                    if (valor > 9 ) valor = 1;
                }
            }
        }
    }

    public static Posicao proximaPosicao(Tabuleiro tab, Posicao pos) {
        int col;
        int lin;

        col = pos.getColuna().getIdentificacao();
        lin = pos.getLinha().getIdentificacao();

        col++;

        if (col == 10) {
            col = 1;
            lin++;
            if (lin == 10) {
                lin = 1;
            }
        }

        return tab.getPosicao().get(getChave(lin, col));
    }

    public static String getChave(int linha, int coluna) {
        return String.valueOf(linha) + String.valueOf(coluna);
    }
    
    public static boolean tabuleiroNovo(Tabuleiro tab) {
        
        List<Posicao> posicao= new ArrayList<Posicao>(tab.getPosicao().values());
        
        for (Posicao p : posicao){
            
            if (!(p.getValor() == 0)){
                
                return false;
                
            }
        }
        
        return true;
    }
}
